// Lab_sketch_1.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "Lab_sketch_1.h"

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;								// current instance
TCHAR szTitle[MAX_LOADSTRING];					// The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];			// the main window class name

// DirectDraw

IDirectDraw7 *pIDD;
LPDIRECTDRAWSURFACE7 primsurf, backsurf = NULL, circlesurf = NULL, locussurf = NULL;
SIZE sizScreen;
BOOL bFullScreen;

// Forward declarations of functions included in this code module:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO: Place code here.
	MSG msg;
	HACCEL hAccelTable;

	// Initialize global strings
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_LAB_SKETCH_1, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// Perform application initialization:
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}
	int c = 0;
	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_LAB_SKETCH_1));
	// Main message loop:
	while (TRUE)
	{
		if (PeekMessage(&msg,NULL,NULL,NULL,PM_NOREMOVE))
		{
			if (!GetMessage(&msg, NULL, 0, 0)) break;
			if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}
		if (primsurf && backsurf)
		{
			if (primsurf->IsLost()) 
			{
				primsurf->Restore();
				if (backsurf->IsLost()) backsurf->Restore();
				if (circlesurf->IsLost()) 
				{ 
					circlesurf->Restore();
					circlesurf->Release();
					CreateCircle (pIDD, &circlesurf, 0xF558,sizScreen.cy / 3, 0);
				}
			}
			c++;
			ClearSurface(backsurf,0);
			if (c >= (sizScreen.cx + sizScreen.cy * 2 / 3)) c = 0;
			RECT rectSrc;
			rectSrc.top = 0;
			rectSrc.bottom = sizScreen.cy * 2 / 3;
			int x;
			if (c < sizScreen.cy * 2 / 3)
			{
				rectSrc.left = sizScreen.cy * 2 / 3 - c;
				rectSrc.right = sizScreen.cy * 2 / 3;
				x = 0;
			}
			else
			{
				if (c > sizScreen.cx)
				{
					rectSrc.left = 0;
					rectSrc.right = sizScreen.cy * 2 / 3 + sizScreen.cx - c;
					x = c - sizScreen.cy * 2 / 3;
				}
				else
				{
					rectSrc.left = 0;
					rectSrc.right = sizScreen.cy * 2 / 3;
					x = c - sizScreen.cy * 2 / 3;
				}
			}
			backsurf->BltFast(x, sizScreen.cy / 6,
				circlesurf,&rectSrc,DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
			if (bFullScreen) 
			{
				primsurf->Flip(NULL,DDFLIP_WAIT);
			}
		}
	}

	return (int) msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage are only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LAB_SKETCH_1));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= NULL;//(HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= NULL;//MAKEINTRESOURCE(IDC_LAB_SKETCH_1);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HINSTANCE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }
	sizScreen.cx = 800; sizScreen.cy = 600;
	DXDDInit(&pIDD, &primsurf, &backsurf,hWnd,sizScreen.cx,sizScreen.cy,16,&bFullScreen);
	CreateCircle (pIDD, &circlesurf, 0xF5A8,sizScreen.cy / 3, 0);
	
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND	- process the application menu
//  WM_PAINT	- Paint the main window
//  WM_DESTROY	- post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
//	PAINTSTRUCT ps;
//	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
//	case WM_PAINT:
//		hdc = BeginPaint(hWnd, &ps);
		// TODO: Add any drawing code here...
//		EndPaint(hWnd, &ps);
//		break;
	case WM_DESTROY:
		if (circlesurf) {circlesurf->Release(); circlesurf = NULL;}
		if (backsurf) {backsurf->Release(); backsurf = NULL;}
		if (primsurf) {primsurf->Release(); primsurf = NULL;}
		if (pIDD) {pIDD->Release(); pIDD = NULL;}
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}